home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / compuserve-file-archive / 12 C64 Telecom / CRC-ML.TXT < prev    next >
Encoding:
Text File  |  2019-04-13  |  3.3 KB  |  172 lines

  1.  
  2. ********************************
  3. *   CRC PROTOCOL CALCULATION   *
  4. *   FOR COMMODORE COMPUTERS    *
  5. *        By Tom Brown          *
  6. ********************************
  7.  
  8.  
  9. calc = $1021
  10.  
  11.  
  12. ************************************
  13. * THE POLYNOMIAL $1021 IS FOR THE  *
  14. * CALCULATION 2^16 + 2^12 + 2^5 + 1*
  15. * THE NUMBER IS GOTTEN BY USING A  *
  16. * 1 IN EACH BIT CORRESPONDING TO   *
  17. * THE POLYNOMIAL.                  *
  18. * EG: $1021 HAS A 1 IN BIT 0,5,& 12*
  19. ************************************
  20.  
  21.  
  22.  
  23.  org $1300
  24.  
  25. *
  26. * FIRST, WE HAVE TO ERASE THE OLD
  27. * CRC VALUE AND INITIALIZE THE
  28. * POLYNOMIAL WE WILL USE FOR THE
  29. * CALCULATION. NOTE THAT THE POLY
  30. * VARIABLE CAN BE CHANGED IN ONE
  31. * PLACE TO BE USED BY THE WHOLE
  32. * ROUTINE.
  33. * A CALLING ROUTINE WILL CALL THIS
  34. * ONLY ONCE. SUBSEQUENT CALLS WILL
  35. * BE TO crcalc.
  36. *
  37.  
  38.  
  39. initcrc lda #0
  40.  sta crc ;CRC CALCULATION
  41.  sta crc+1
  42.  lda #<calc
  43.  sta poly ;POLYNOMIAL
  44.  lda #>calc
  45.  sta poly+1
  46.  rts
  47.  
  48.  
  49. *
  50. * THIS ROUTINE WILL CALCULATE THE
  51. * CRC CHECKSUM WITH THE BYTE CURRENTLY
  52. * IN THE ACCUMULATOR.
  53. *
  54.  
  55.  
  56. crcalc ldx #8 ;COUNT 8 BITS
  57. loop pha  ;SAVE DATA
  58.  
  59.  
  60. *
  61. * FIRST, WE xor BIT 7 OF DATA WITH
  62. * BIT 15 OF CRC (BIT 7 OF HIGH BYTE)
  63. *
  64.  
  65.  
  66.  
  67.  and #12    ;GET BIT 7
  68.  eor crc+1 ;HIGH BYTE
  69.  sta crc+1
  70.  
  71.  
  72. *
  73. * NOW WE SHIFT CRC (HI & LOW BYTES)
  74. * LEFT ONE BIT. THE asl PUTS A 0 INTO
  75. * BIT 0 OF CRC LOW,SHIFTS CRC LOW BYTE
  76. * LEFT ONE BIT, BIT 7 FALLING INTO THE
  77. * CARRY. THE rol SHIFTS THE CRC HIGH
  78. * BYTE LEFT 1 BIT, THE CARRY IS MOVED
  79. * INTO BIT 0 OF CRC HIGH BYTE, AND BIT
  80. * 7 FALLS INTO THE NOW-EMPTY CARRY
  81. *
  82.  
  83.  
  84.  clc  ;CLEAR CARRY
  85.  asl crc ;SHIFT LOW BYTE
  86.  rol crc+1 ;NOW HIGH
  87.  bcc crcalc1
  88.  
  89.  
  90. *
  91. * BIT 15 (BIT 7 OF HIGH CRC BYTE) OF
  92. * CRC WAS SHIFTED INTO THE CARRY.
  93. * IF    HIS BIT WAS 1 THEN EXCLUSIVE-OR
  94. * THE CRC WITH THE POLYNOMIAL
  95. *
  96.  
  97.  
  98.  lda poly ;POLYNOMIAL LOW
  99.  eor crc ;CRC LOW BYTE
  100.  sta crc
  101.  lda poly+1 ;POLYNOMIAL HIGH
  102.  eor crc+1
  103.  sta crc+1
  104.  
  105.  
  106. *
  107. * NOW WE SHIFT THE DATA BYTE LEFT 1 BIT
  108. * AND DECREMENT OUR BIT COUNTER
  109. * AS LONG AS IT'S NOT ZERO, WE CONTINUE
  110. * OUR BITWISE CALCULATION
  111. *
  112.  
  113.  
  114. crcalc1 pla  ;RESTORE DATA
  115.  asl  ;NEW BIT 7
  116.  dex  ;DEC BIT COUNT
  117.  bne loop
  118.  rts  ;WHEW! DONE.
  119.  
  120.  
  121. *
  122. * THESE ARE THE DATA BYTES
  123. *
  124.  
  125. crc hex 0000
  126. poly hex 0000
  127.  
  128.  
  129. ********************************     THIS SOURCECODE WOULD NOT BE *
  130. * POSSIBLE WITHOUT THE HELP OF *
  131. * BOB UMFER AND PETE BOSWELL   *
  132. * (AKA topper), BOTH OF plink  *
  133. ********************************
  134.  
  135.  
  136. ********************************
  137. * THIS CODE WAS WRITTEN ON THE *
  138. * merlin ASSEMBLER, FOR THE    *
  139. * COMMODORE 128. JUST CHANGE   *
  140. * THE LOAD LOCATION FOR THE 64 *
  141. * AS THERE ARE NO MACHINE      *
  142. * SPECIFIC ROUTINES USED       *
  143. ********************************
  144.  
  145.  
  146.  
  147. The following is the BASIC sourcecode in Basic 7.0 for the C-128
  148. to test the     chine language CRC calculation routine.
  149. Answer 1 to the prompt each time & you should get the following
  150. sequence of numbers:
  151.  
  152. HIGH BYTE       LOW BYTE     COMBINED VALUE
  153. =========       ========     ==============
  154.  
  155.    16              33            4129
  156.    35              16            8976
  157.    20              32            5152
  158.    98             148           25236
  159.  
  160.  
  161. All values are, of course, in decimal
  162.  
  163.  
  164.  
  165. 10 SYS(DEC("1300"))
  166. 20 INPUT"ENTER VALUE";A$:A=VAL(A$)
  167. 30 SYS(DEC("1313")),A:A=PEEK(DEC("1340")):B=P    K(DEC("133F"))
  168. 40 C=(A*256)+B
  169. 50 PRINTA,B,C
  170. 60 GOTO20
  171.  
  172.